package com.hibegin.http.server.web;

import com.hibegin.http.server.config.ServerConfig.StaticResourceLoader;
import com.hibegin.http.server.impl.HttpRequest;
import com.hibegin.http.server.impl.HttpResponse;
import com.hibegin.http.server.util.HttpMethod;
import com.hibegin.http.server.util.MimeTypeUtil;
import com.szwistar.common.ERR;
import com.szwistar.common.os.PathUtils;

import java.io.InputStream;
import java.util.Map;

/**
 * 尝试在用户自定义的静态资源映射表中查找文件
 * 注意：是通过 ServerConfig.addStaticResourceMapper() 添加的
 */
public class Interceptor4StaticResource implements Interceptor {
    @Override
    public boolean doInterceptor(HttpRequest request, HttpResponse response) throws Exception {
    	// 取出用户自定义的静态资源映射表
    	Map<String, StaticResourceLoader> uriMap = request.getServerConfig().getStaticResourceMapper();
    	// 逐个检查映射表
        for(String uri : uriMap.keySet()) {
        	// 检查资源 URL 路径是否匹配
            if(!request.getUri().startsWith(uri)) { continue; }

        	// 路径匹配，取资源路径
            String path = request.getUri().substring(uri.length());
            if(path.endsWith("/")) {
            	// 如果是目录，则取默认主页文件
                path += request.getServerConfig().getWelcomeFile();
            }

            // 取得资源输入流
            InputStream inputStream = uriMap.get(uri).getInputStream(path);
            // 如果流为空，说明资源不存在，尝试下一个映射
            if(inputStream == null) { continue; }

            // 尝试根据资源文件扩展名，取得对应的 Content-Type
            String contentType = null;
            if(path.contains(".")) {
                contentType = MimeTypeUtil.getContentType(PathUtils.getFileExtension(path));
            }

            // 发送数据
            boolean headOnly = (request.getMethod() == HttpMethod.HEAD);
            response.renderStream(ERR.HTTP_OK, contentType, inputStream, null, headOnly);
            return false;
        }

        // 资源不存在，交给其它拦截器处理
        return true;
    }
}
